///|
#external
type Document

///|
pub extern "js" fn document() -> Document = "() => document"

///|
pub extern "js" fn Document::create_element(
  self : Self,
  tag : String,
) -> Element = "(doc,tag) => doc.createElement(tag)"

///|
pub let namespace_html = "http://www.w3.org/1999/xhtml"

///|
pub let namespace_svg = "http://www.w3.org/2000/svg"

///|
pub let namespace_mathml = "http://www.w3.org/1998/Math/MathML"

///|
pub extern "js" fn Document::create_element_ns(
  self : Self,
  namespace_uri : String,
  qualified_name : String,
  on_namespace_error~ : (DOMException) -> Element = default_exception_handler,
  on_invalid_character_error~ : (DOMException) -> Element = default_exception_handler,
) -> Element = "(doc,namespace,qualifiedName) => doc.createElementNS(namespace, qualifiedName)"

///|
pub extern "js" fn Document::create_text_node(
  self : Self,
  str : String,
) -> Element = "(doc,str) => doc.createTextNode(str)"

///|
pub extern "js" fn Document::create_document_fragment(
  self : Self,
) -> DocumentFragment = "(doc) => doc.createDocumentFragment()"

///| https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById
pub extern "js" fn Document::get_element_by_id(
  self : Self,
  id : String,
) -> @js.Nullable[Element] = "(doc,id) => doc.getElementById(id)"

///| https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName
pub extern "js" fn Document::get_elements_by_class_name(
  self : Self,
  names : String,
) -> HTMLCollection = "(doc,names) => doc.getElementsByClassName(names)"

///| https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByName
pub extern "js" fn Document::get_elements_by_name(
  self : Self,
  name : String,
) -> NodeList = "(doc,name) => doc.getElementsByName(name)"

///| https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByTagName
pub extern "js" fn Document::get_elements_by_tag_name(
  self : Self,
  tag : String,
) -> HTMLCollection = "(doc,tag) => doc.getElementsByTagName(tag)"

///| https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByTagNameNS
pub extern "js" fn Document::get_elements_by_tag_name_ns(
  self : Self,
  namespace_ : String,
  name : String,
) -> HTMLCollection = "(doc,namespace,name) => doc.getElementsByTagNameNS(namespace, name)"

///| https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector
pub extern "js" fn Document::query_selector(
  self : Self,
  selectors : String,
) -> @js.Nullable[Element] = "(self,selectors) => self.querySelector(selectors)"

///| https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll
pub extern "js" fn Document::query_selector_all(
  self : Self,
  selectors : String,
) -> NodeList = "(self,selectors) => self.querySelectorAll(selectors)"

///|
pub extern "js" fn Document::to_node(self : Self) -> Node = "(x) => x"
